package cn.itcast.bos.action.base;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;

import cn.itcast.bos.domain.base.Courier;
import cn.itcast.bos.service.base.ICourierService;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/** 
 * 快递员的控制层
 *
 * @author Shao-Fei Fan 
 * @version 1.0,2017年9月3日 下午8:19:31 
 */

@Controller
@Scope("prototype")

@ParentPackage("json-default")
@Namespace("/")
public class CourierAction extends ActionSupport implements ModelDriven<Courier>{
	
	// 获取分页数据
	private int page;
	private int rows;
	
	public void setPage(int page) {
		this.page = page;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	// 获得courier的事物层对象
	@Autowired
	private ICourierService courierService;
	// 获得模型类
	private Courier c = new Courier();
	
	@Override
	public Courier getModel() {
		return c;
	}
	
	/**
	 * 添加courier
	 * @return
	 */
	@Action(value="courier_saveAll",results={@Result(name="success",location="./pages/base/courier.html",type="redirect")})
	public String saveCourier(){
		courierService.saveCourier(c);
		
		return SUCCESS;
	}
	
	/**
	 * 分页显示courier数据
	 *//*
	@Action(value="courier_show",results={@Result(name="success",type="json")})
	public String showCourierByPage(){
		Pageable pageable = new PageRequest(page-1, rows);
		
		Page<Courier> couriers = courierService.showCourierByPage(pageable);
		
		ServletActionContext.getContext().getValueStack().push(couriers);
		return SUCCESS;
	}*/
	/**
	 * 带条件分页显示courier数据
	 */
	@Action(value="courier_show",results={@Result(name="success",type="json")})
	public String showCourierByPage(){
		Pageable pageable = new PageRequest(page-1, rows);
		
		Specification<Courier> specification = new Specification<Courier>() {

			@Override
			/**
			 * 构造条件查询方法，如果返回为null，代表无条件查询
			 * Root参数为了获得name=？中的name
			 * CriteriaQuery 参数 构造简单的条件返回，提供where方法
			 * CriteriaBuilder 参数 构造Predicate对象 ， 条件对象，构造复杂查询效果
			 */
			public Predicate toPredicate(Root<Courier> root,
					CriteriaQuery<?> query, CriteriaBuilder cb) {
				// 构造一个list用于添加条件
				List<Predicate> list = new ArrayList<Predicate>();
				
				// 单表查询
				if(StringUtils.isNotBlank(c.getCourierNum())){
					// 进行员工工号的查询
					Predicate p1 = cb.equal(root.get("courierNum").as(String.class), c.getCourierNum());
					list.add(p1);
				}
				if(StringUtils.isNotBlank(c.getCompany())){
					// 进行公司的查询
					// 模糊查询，like %**%
					Predicate p2 = cb.like(root.get("company").as(String.class), "%"+c.getCompany()+"%");
					list.add(p2);
				}
				if(StringUtils.isNotBlank(c.getType())){
					// 进行快递员类型的查询，等值查询
					// 模糊查询，equal
					Predicate p3 = cb.equal(root.get("type").as(String.class), c.getType());
					list.add(p3);
				}
				
				// 多表查询（查询当前对象，关联对应数据表）
				// 使用Courier(root)，关联standard
				Join<Object,Object> standardtroot = root.join("standard",JoinType.INNER);
				if(c.getStandard()!=null && StringUtils.isNotBlank(c.getStandard().getName())){
					//进行模糊查询
					Predicate p4 = cb.like(standardtroot.get("name").as(String.class), "%"+c.getStandard().getName()+"%");
					list.add(p4);
				}
				return cb.and(list.toArray(new Predicate[0]));
			}
		};
		
		Page<Courier> couriers = courierService.showCourierByPage(specification,pageable);
		
		// 封装map
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("total", couriers.getTotalElements());
		map.put("rows", couriers.getContent());
		ServletActionContext.getContext().getValueStack().push(map);
		return SUCCESS;
	}
	
	/**
	 * 废除操作
	 */
	// 获得ID值
	private String ids;

	public void setIds(String ids) {
		this.ids = ids;
	}
	
	@Action(value="courier_delete",results={@Result(name="success",location="./pages/base/courier.html",type="redirect")})
	public String deletCourier(){
		String[] split = ids.split(",");
		for (String string : split) {
			// 转化为int格式，调用service层进行修改操作
			Integer id = Integer.parseInt(string);
			courierService.deletCourier(id);
			
		}
		
		return SUCCESS;
		
	}
	/**
	 * 还原操作
	 * @return
	 */
	@Action(value="courier_restore",results={@Result(name="success",location="./pages/base/courier.html",type="redirect")})
	public String restoreCourier(){
		String[] split = ids.split(",");
		for (String string : split) {
			// 转化为int格式，调用service层进行修改操作
			Integer id = Integer.parseInt(string);
			courierService.restoreCourier(id);
		}
		return SUCCESS;
		
	}
	
	
	/**
	 * 查询未关联定区的快递员
	 * @return
	 */
	@Action(value="courier_findnoAssociationFixedArea",results={@Result(name="success",type="json")})
	public String courier_findnoAssociationFixedArea(){
		System.out.println("进来了");
		List<Courier> couriers = courierService.findnoAssociationFixedArea();
		
		ServletActionContext.getContext().getValueStack().push(couriers);
		return SUCCESS;
	}
	
	
}
